热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

主调|大侠_重温C++

篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温C++相关的知识,希望对你有一定的参考价值。 C++ 1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后

篇首语:本文由编程笔记#小编为大家整理,主要介绍了重温C++相关的知识,希望对你有一定的参考价值。


C++
1 子函数可以把定义放在MAIN函数前, 实现在MAIN函数后
2 函数之间的值传和地址传方式

call()

vector<string> name;
string lastname
who_is(&name,&lastname);
cout<<name<<endl;

void who_is(vector<string> *p_firstname,string *p_lastname)

string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
*p_lastname&#61;l_v_str_firstname;
p_firstname->push_back(l_v_str_firstname);

调用函数call把本地变量的name地址传给被调用函数who_is

被调函数声明为指针 string *p_name
给指针赋值 *p_lastname&#61;l_v_str_firstname;
给指针赋地址 p_name&#61;&l_v_str_firstname

被调函数who_is 不能把函数内部的变量传到外面去&#xff0c;因为函数调用完后就被清除了。
这样函数内部要把工作结果返回出去&#xff0c;一方面可以通过RETRUN 可惜只能返回1个。
要多个必须主调函数把外面的变量地址传进来&#xff0c;然后给这个地址空间赋值&#xff0c;真实的值。

上面指针比较容易让人混淆&#xff0c;主要是跟普通变量相比。
很容易给指针赋值写成了 p_name&#61;l_v_str_firstname。这实际上把指针里面的地值替换成新的内存地址。
对指针是4个字节32位的存储空间&#xff0c;里面只存放内存地址。
另外个混淆的地方就是指针定义和指针使用 string *p 定义指针 *p&#61; 取指针里面的值。

另还有个引用传值

call()

vector<string> name;
string lastname
who_is(name,lastname);
cout<<name<<endl;

void who_is(vector<string> &p_firstname,string &p_lastname)

string l_v_str_firstname("曾");
string l_v_str_lastname("大侠");
p_lastname&#61;l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);

这里主调函数不用&方式把地址传进去&#xff0c;而被调函数通过&方式声明使用主调函数变量的地址
在被调函数内部直接使用该变量&#xff0c;声明形式的变量

p_lastname&#61;l_v_str_firstname;
p_firstname.push_back(l_v_str_firstname);

直接赋值不用*来表示&#xff0c;访问成员函数不用-> 而代替的是.
这或许是C&#43;&#43;避免让大家混淆吧&#xff01;
这种方式干净简单不乱&#xff0c;建议使用。如果编辑存C就无法使用。

大家对&#xff23;或者&#xff23;&#xff0b;&#xff0b;感兴趣&#xff0c;可以在自己的虚拟机上编程一下
linux c/c&#43;&#43; hello word
https://blog.csdn.net/ZengMuAnSha/article/details/5826949
这篇小仙的博客老早以前在LINUX下写的。

Linux下C&#43;&#43;连接oracle数据库 OCCI 接口
https://blog.csdn.net/ZengMuAnSha/article/details/51438251
这篇也是在LINUX下使用ORACLE公司免费的IDE NETBEAN8 C&#43;&#43;版本
然后再使用ORACLE公司提供的OCCI库&#xff0c;开发个ORACLE数据库的DEMO
最主要的是NETBEAN8可以支持中文版。有IDE支持很多配置易如反掌&#xff01;
文中的11.2.0.4 SDK下载地址早已失效了

SDK下载地址:
https://download.oracle.com/otn/linux/instantclient/11204/instantclient-sdk-linux.x64-11.2.0.4.0.zip?AuthParam&#61;1575559586_5112f43f5a3f136e263c2afa58b8d757
BAISC:
https://download.oracle.com/otn_software/linux/instantclient/195000/instantclient-basic-linux.x64-19.5.0.0.0dbru.zip
这两个就是OCCI库,都是免费下载的. 不过你只需要注册免费的ORACLE账号就行.

使用IDE在LINUX下编程,自然需要图形界面,LINUX下的XWINDOX系统,还有个GNOME桌面系统. 一般情况下我装系统都会带图形支持,然后INIT3切换到字符界面上. 我使用XMAGNER 的XPASSVIE 什么鬼的工具,可把NETBEAN导到WIN7在操作.

我百度网盘共享一个NETBEAN 不确定是否支持C&#43;&#43;,你可以直接上ORACLE官方下.
https://pan.baidu.com/s/16vvlRqjBZkbYCRXKK5IVRg 提取码:l39j
当然你不想整那么多的话,可以直接在虚拟机中的Linux图形界面编程,可以不用XSHELL.
当然NETBEAN 8需要JDK8
我使用ORACLE用户在LINUX下安装这两个家伙的. 另外环境设置下参数

export PATH&#61;$ORACLE_BASE/OPatch:$ORACLE_HOME/bin:$CRS_HOME/bin:$PATH:/sbin
export LD_LIBRARY_PATH&#61;$ORACLE_HOME/lib:$LD_LIBRARY_PATH

PATH最好是把JDK的路径放在最前面.因为虚拟机上的ORACLE也带JAVA.
ORACLE 11G 一般带JAVA7 你在LINUX下java -version 看下是否正确。
LD_LIBRARY_PATH 是库路径&#xff0c;主要调试的时候需要知道它在哪里。
这个主要是OCCI库的BASIC这个包解压的路径。

好了作为ODBA 你除了会PL/SQL,SHELL外 你还会C&#43;&#43; 你可看起来很装逼的语言&#xff1a;
下面是开发个类似ANSIBEL批量执行SQL在30台数据库服务器上

/*
* File: main.cpp
* Author: oracle
*
* Created on 2019年12月4日, 下午4:11
*/

#include
#include <iostream>
#include
#include
#include
using namespace std; //这个是C&#43;&#43;标准库
using namespace oracle::occi;//这个是OCCI库 命名空间
/*
* 先把3个函数的声明放在主函数前
*/

void Conn_Db_Exec(string user,string pwd,string conn,string sql);
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd, vector<string> &p_v_str_conn, string s_classA,string s_classB,string s_classC,string s_dbname);
void read_sql_conf(string &psqltext,string psql_id);
int main(int argc, char** argv) //sqlid,classA,classB,classC,dbname

vector<string> m_v_user; //定义3个字符串数组
vector<string> m_v_pwd;
vector<string> m_v_conn;
string m_s_sql_text; //定义6个字符串变量
string m_s_sql_id;
string m_s_classA;
string m_s_classB;
string m_s_classC;
string m_s_dbname;
for (int i&#61;0;i<argc; i&#43;&#43;) //显示你输入的参数

cout<<"Your input Parameter:"<<endl;
cout<<argv[i]<<endl;

if (argc>0)//把输入的参数赋值给变量们

m_s_sql_id &#61;argv[0];
m_s_classA&#61;argv[1];
m_s_classB&#61;argv[2];
m_s_classC&#61;argv[3];
if (argc&#61;&#61;5)

m_s_dbname&#61;argv[4];

else

m_s_dbname.clear();

read_db_conf(m_v_user,m_v_pwd,m_v_conn,m_s_classA,m_s_classB,m_s_classC,m_s_dbname); //读入数据库连接信息
read_sql_conf(m_s_sql_text,m_s_sql_id);//读需要执行的SQL

else cout<<"You not innput parameter"<<endl;
if (m_s_sql_text.size() >0 ) //以下是对连接信息和SQL的检验

if (m_v_user.size() >0)

if(m_v_user.size()&#61;&#61;m_v_pwd.size() && m_v_user.size()&#61;&#61;m_v_conn.size())

for (int i&#61;0;i<m_v_user.size();i&#43;&#43;) //没毛病的话就循环执行SQL

cout<<m_v_user[i]<<endl;
cout<<m_v_pwd[i]<<endl;
cout<<m_v_conn[i]<<endl;
// Conn_Db_Exec(m_v_user[i],m_v_pwd[i],m_v_conn[i],m_s_sql_text); //是针对30台ORACLE数据库的哟&#xff01;

else cout<<"This Database Number is not as! user.size !&#61; pwd.size !&#61;conn.size" <<endl;
else cout<<"Not Find any database info!"<<endl;

else cout<<"Not Find any SQL TEXT info!"<<endl;
//Conn_Db_Exec(main_user,main_pwd,main_conn,main_sql);
return 0;

//以下是读取数据库配置文件&#xff0c;把3个数组的地址传进来装东西的
void read_db_conf(vector<string> &p_v_str_user,vector<string> &p_v_str_pwd,
vector<string> &p_v_str_conn,
string s_classA,string s_classB,string s_classC,string s_dbname)

string str_user("scott");//这先暂时存在变量里&#xff0c;将来打算存在db.conf个文件中
string str_pwd("123456");
string str_conn("192.168.2.21:1521/SHARKDB");
p_v_str_user.push_back(str_user); //把从文件读到的信息放进数组中
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
str_user&#61;"system";
str_pwd&#61;"123456";
str_conn&#61;"192.168.2.21:1521/SHARKDB";
p_v_str_user.push_back(str_user);
p_v_str_pwd.push_back(str_pwd);
p_v_str_conn.push_back(str_conn);
/*
p_v_str_user->push_back(str_user);
p_v_str_pwd->push_back(str_pwd);
p_v_str_conn->push_back(str_conn);*/


//同上根据SQLID从配置文件获得SQL
void read_sql_conf(string &psqltext,string psql_id)

string l_str_sqltext;
l_str_sqltext&#61;"select sysdate from dual";
psqltext&#61;l_str_sqltext;

//数据库连接执行函数&#xff0c;把上面得到的链接信息和SQL传过来
void Conn_Db_Exec(string user,string pwd,string strconn,string sql)

//以下是OCCI 4个重要指针变量 分别是环境&#xff0c;连接&#xff0c;语句&#xff0c;结果
Environment *env;
Connection *conn;
Statement *stmt;
ResultSet *rset;
// 定义4个本地变量承接参数&#xff0c;其实也没必要。
string str_user&#61;user;
string str_pwd&#61;pwd;
string str_conn&#61;strconn;
string str_sql&#61;sql;
env &#61; Environment::createEnvironment(Environment::OBJECT); //环境初始化
try

conn &#61;env->createConnection(str_user,str_pwd,str_conn);//创建连接
if(conn!&#61;NULL)
cout<<"Connect Success"<<endl;
else
cout<<"Connect Failed!"<<endl;
stmt&#61;conn->createStatement(str_sql); //创建语句
rset&#61;stmt->executeQuery(); //执行语句&#xff0c;并返回结果
while(rset->next()) //结果循环打印行

string tr_day&#61;rset->getString(1); //这里每个字段打印一下
cout<<"This Database date is :"<<tr_day<<endl;


catch(SQLException e) //异常处理

cout<<e.what()<<endl; //简单地显示异常&#xff0c;并关闭4个重要指针
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);
//最后还是释放4个指针。
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
env->terminateConnection(conn);
Environment::terminateEnvironment(env);

大家可以在公众号查看本文


推荐阅读
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 主要用了2个类来实现的,话不多说,直接看运行结果,然后在奉上源代码1.Index.javaimportjava.awt.Color;im ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • 本文探讨了 Objective-C 中的一些重要语法特性,包括 goto 语句、块(block)的使用、访问修饰符以及属性管理等。通过实例代码和详细解释,帮助开发者更好地理解和应用这些特性。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 本文深入探讨了 Java 编程语言的基础,特别是其跨平台特性和 JVM 的工作原理。通过介绍 Java 的发展历史和生态系统,帮助初学者理解如何编写并运行第一个 Java 程序。 ... [详细]
author-avatar
111222
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有